home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 14 / CU Amiga Magazine's Super CD-ROM 14 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-09].iso / CUCD / Programming / GMS / Source / Asm / Demos / Pobs.s < prev    next >
Encoding:
Text File  |  1997-05-02  |  9.1 KB  |  404 lines

  1. ;-------T-------T------------------------T----------------------------------;
  2. ;POBS DEMO
  3. ;---------
  4. ;This demo originally came from the HowToCode series.
  5. ;
  6. ;This demo took just 15 minutes in being converted to a multi-tasking demo,
  7. ;there is no speed loss in run-time.
  8.  
  9.     INCDIR    "INCLUDES:"
  10.     INCLUDE    "games/games_lib.i"
  11.     INCLUDE    "games/games.i"
  12.  
  13. CALL    MACRO
  14.     jsr    _LVO\1(a6)
  15.     ENDM
  16.  
  17. width    EQU    40
  18. height    EQU    256
  19.  
  20.     SECTION    "Pobs",CODE
  21.  
  22. ;==========================================================================;
  23. ;                             INITIALISE DEMO
  24. ;==========================================================================;
  25.  
  26.     STARTGMS
  27.  
  28. Start:    MOVEM.L    A0-A6/D1-D7,-(SP)
  29.     move.l    GMSBase(pc),a6
  30.     lea    ScreenTags(pc),a0
  31.     CALL    ShowScreen
  32.     tst.l    d0
  33.     beq.s    .Error_Screen
  34.  
  35.     bsr.s    Main
  36.  
  37. .ReturnToDOS
  38.     move.l    GMSBase(pc),a6
  39.     move.l    Screen(pc),a0
  40.     CALL    DeleteScreen
  41. .Error_Screen
  42.     MOVEM.L    (SP)+,A0-A6/D1-D7
  43.     moveq    #ERR_OK,d0
  44.     rts
  45.  
  46. ;==========================================================================;
  47. ;                                MAIN LOOP
  48. ;==========================================================================;
  49.  
  50. Main:    bsr.s    InPtabs
  51.     bsr.w    Rmasks
  52.  
  53. .loop    move.l    GMSBase(pc),a6
  54.     move.l    Screen(pc),a0
  55.     CALL    WaitVBL
  56.     CALL    SwapBuffers
  57.  
  58.     moveq    #BUFFER3,d0
  59.     CALL    ClrScreen
  60.  
  61.     bsr.w    Calc
  62.     bsr.w    Put
  63.  
  64.     cmp.w    #293-1,number
  65.     beq.b    .mouse
  66.     addq.w    #1,number
  67.  
  68. .mouse    move.l    GMSBase(pc),a6
  69.     moveq    #JPORT1,d0
  70.     CALL    ReadMouse
  71.     btst    #MB_LMB,d0
  72.     beq.s    .loop
  73.     rts
  74.  
  75. ;===========================================================================;
  76. ;                            SET UP POB TABLES
  77. ;===========================================================================;
  78.  
  79. InPtabs    lea    pob_xbuffer,a0    ;a0 = Ptr to XBuffer.
  80.     moveq    #$00,d0    ;d0 = 00.
  81. .xloop    move.w    d0,d1
  82.     and.w    #$000f,d1    ;d1 = $000x
  83.     lsl.w    #6,d1    ;d1 = <<6
  84.     move.w    d1,(a0)+    ;a0 = +d1
  85.     move.w    d0,d1
  86.     and.w    #$fff0,d1    ;d2 = $xxx0
  87.     ror.w    #3,d1    ;d2 = $?xxx
  88.     move.w    d1,(a0)+    ;a0 = +d2
  89.     addq.w    #1,d0    ;d0 = ++1
  90.     cmp.w    #width*8,d0    ;d0 > Is d0 == ScreenWidth?
  91.     bne.b    .xloop
  92.  
  93.     lea    pob_ybuffer,a0
  94.     moveq    #$00,d0
  95. .yloop    move.w    d0,d1
  96.     mulu    #width,d1
  97.     move.l    d1,(a0)+
  98.     addq.w    #1,d0
  99.     cmp.w    #height,d0
  100.     bne.b    .yloop
  101.     rts
  102.  
  103. ;===========================================================================;
  104. ;
  105. ;===========================================================================;
  106.  
  107. Rmasks:    moveq    #0,d7
  108.     lea    shape_buffer,a1
  109. .loop1    lea    pob_shape(pc),a0
  110.     move.w    #16,d6
  111. .loop2    move.l    (a0)+,d0
  112.     ror.l    d7,d0
  113.     move.l    d0,(a1)+
  114.     subq.w    #1,d6
  115.     bne.b    .loop2
  116.     addq.w    #1,d7
  117.     cmpi.w    #16,d7
  118.     bne.b    .loop1
  119.     rts
  120.  
  121. ;===========================================================================;
  122. ;                       ADJUST POB SCREEN POSITIONS
  123. ;===========================================================================;
  124.  
  125. Calc:    move.w    #$eeee,d0
  126.     move.w    #720,d6
  127.     lea    sinx_pointer1(pc),a0
  128.  
  129.     movem.l    (a0),a2/a3/a4/a5
  130.     movem.w    sinx_add1(pc),d2/d3/d4/d5
  131.  
  132.     add.w    d2,a2
  133.     cmp.w    (a2),d0
  134.     bne.s    .bkip1
  135.     sub.w    d6,a2
  136.  
  137. .bkip1    add.w    d3,a3
  138.     cmp.w    (a3),d0
  139.     bne.s    .bkip2
  140.     sub.w    d6,a3
  141.  
  142. .bkip2    add.w    d4,a4
  143.     cmp.w    (a4),d0
  144.     bne.s    .bkip3
  145.     sub.w    d6,a4
  146.  
  147. .bkip3    add.w    d5,a5
  148.     cmp.w    (a5),d0
  149.     bne.s    .bkip4
  150.     sub.w    d6,a5
  151.  
  152. .bkip4    movem.l    a2/a3/a4/a5,(a0)
  153.     lea    coord_stack,a0
  154.     movem.w    sinx_dist1(pc),d3-d4/a1/a6
  155.     move.w    d0,d5
  156.     move.w    number(pc),d7    ;d7 = Number of Pobs.
  157. .loop    add.w    d3,a2
  158.     add.w    d4,a3
  159.     cmp.w    (a2),d5
  160.     bne.s    .not_x1
  161.     sub.w    d6,a2
  162. .not_x1    cmp.w    (a3),d5
  163.     bne.s    .not_x2
  164.     suba.w    d6,a3
  165. .not_x2    move.w    (a2),d0
  166.     add.w    (a3),d0
  167.     add.w    a1,a4
  168.     add.w    a6,a5
  169.     cmp.w    (a4),d5
  170.     bne.b    .not_y1
  171.     sub.w    d6,a4
  172. .not_y1    cmp.w    (a5),d5
  173.     bne.b    .not_y2
  174.     sub.w    d6,a5
  175. .not_y2    move.w    (a4),d1
  176.     add.w    (a5),d1
  177.     move.w    d0,(a0)+
  178.     move.w    d1,(a0)+
  179.     dbf    d7,.loop
  180.     rts
  181.  
  182. ;===========================================================================;
  183. ;                          PLACE POBS ON SCREEN
  184. ;===========================================================================;
  185.  
  186. Put:    lea    pob_xbuffer,a0
  187.     lea    pob_ybuffer,a1
  188.     lea    shape_buffer,a4
  189.     move.l    Screen(pc),a6
  190.     move.l    GS_MemPtr2(a6),a6
  191.     lea    coord_stack,a5
  192.  
  193.     move.w    number(pc),d7
  194. .loop    movem.w    (a5)+,d0/d1    ;d0 = X, d1 = Y
  195.     add.w    d0,d0
  196.     add.w    d0,d0    ;d0 = (XCoord)*4
  197.     add.w    d1,d1
  198.     add.w    d1,d1    ;d1 = (YCoord)*4
  199.     move.l    (a0,d0.w),d0
  200.     lea    width(a6,d0.w),a3
  201.     add.l    (a1,d1.w),a3
  202.     swap    d0
  203.     lea    (a4,d0.w),a2
  204.     movem.l    (a2),d0-d5    ;d0..d5 = POB Gfx Data. 
  205.     or.l    d0,(a3)
  206.     or.l    d1,width(a3)
  207.     or.l    d2,width*2(a3)
  208.     or.l    d3,width*3(a3)
  209.     or.l    d4,width*4(a3)
  210.     or.l    d5,width*5(a3)
  211.     dbf    d7,.loop
  212.     rts
  213.  
  214. ;===========================================================================;
  215. ;
  216. ;===========================================================================;
  217.  
  218. sinx_pointer1:
  219.     dc.l    sin_xtab
  220. sinx_pointer2:
  221.     dc.l    sin_xtab
  222. siny_pointer1:
  223.     dc.l    sin_ytab
  224. siny_pointer2:
  225.     dc.l    sin_ytab
  226. sinx_add1:
  227.     dc.w    1*2    ;change values here to obtain
  228. sinx_add2:
  229.     dc.w    5*2    ;new patterns
  230. siny_add1:
  231.     dc.w    3*2
  232. siny_add2:
  233.     dc.w    2*2
  234. sinx_dist1:
  235.     dc.w    4*2
  236. sinx_dist2:
  237.     dc.w    3*2
  238. siny_dist1:
  239.     dc.w    1*2
  240. siny_dist2:
  241.     dc.w    2*2
  242. number:    dc.w    0            ;number of 'pobs'
  243.  
  244. sin_xtab:
  245.     dc.w    75,76,78,79,80,82,83,84
  246.     dc.w    85,87,88,89,91,92,93,94
  247.     dc.w    96,97,98,99,101,102,103,104
  248.     dc.w    106,107,108,109,110,111,112,114
  249.     dc.w    115,116,117,118,119,120,121,122
  250.     dc.w    123,124,125,126,127,128,129,130
  251.     dc.w    131,132,132,133,134,135,136,136
  252.     dc.w    137,138,139,139,140,141,141,142
  253.     dc.w    142,143,144,144,145,145,145,146
  254.     dc.w    146,147,147,147,148,148,148,149
  255.     dc.w    149,149,149,149,150,150,150,150
  256.     dc.w    150,150,150,150,150,150,150,150
  257.     dc.w    150,149,149,149,149,149,148,148
  258.     dc.w    148,147,147,147,146,146,145,145
  259.     dc.w    145,144,144,143,142,142,141,141
  260.     dc.w    140,139,139,138,137,136,136,135
  261.     dc.w    134,133,132,132,131,130,129,128
  262.     dc.w    127,126,125,124,123,122,121,120
  263.     dc.w    119,118,117,116,115,114,113,111
  264.     dc.w    110,109,108,107,106,104,103,102
  265.     dc.w    101,99,98,97,96,94,93,92
  266.     dc.w    91,89,88,87,85,84,83,82
  267.     dc.w    80,79,78,76,75,74,72,71
  268.     dc.w    70,68,67,66,65,63,62,61
  269.     dc.w    59,58,57,56,54,53,52,51
  270.     dc.w    49,48,47,46,44,43,42,41
  271.     dc.w    40,39,38,36,35,34,33,32
  272.     dc.w    31,30,29,28,27,26,25,24
  273.     dc.w    23,22,21,20,19,18,18,17
  274.     dc.w    16,15,14,14,13,12,11,11
  275.     dc.w    10,9,9,8,8,7,6,6
  276.     dc.w    5,5,5,4,4,3,3,3
  277.     dc.w    2,2,2,1,1,1,1,1
  278.     dc.w    0,0,0,0,0,0,0,0
  279.     dc.w    0,0,0,0,0,1,1,1
  280.     dc.w    1,1,2,2,2,3,3,3
  281.     dc.w    4,4,5,5,5,6,6,7
  282.     dc.w    8,8,9,9,10,11,11,12
  283.     dc.w    13,14,14,15,16,17,18,18
  284.     dc.w    19,20,21,22,23,24,25,26
  285.     dc.w    27,28,29,30,31,32,33,34
  286.     dc.w    35,36,37,39,40,41,42,43
  287.     dc.w    44,46,47,48,49,51,52,53
  288.     dc.w    54,56,57,58,59,61,62,63
  289.     dc.w    65,66,67,68,70,71,72,74
  290.     dc.w    75
  291.     dc.w    $eeee,$eeee,$eeee,$eeee
  292.     dc.w    $eeee,$eeee,$eeee,$eeee
  293.     dc.w    $eeee,$eeee,$eeee,$eeee
  294.     dc.w    $eeee,$eeee,$eeee,$eeee
  295.     dc.w    $eeee,$eeee,$eeee,$eeee
  296.     dc.w    $eeee,$eeee,$eeee,$eeee
  297.     dc.w    $eeee,$eeee,$eeee,$eeee
  298.     dc.w    $eeee,$eeee,$eeee,$eeee
  299.     dc.w    $eeee,$eeee,$eeee,$eeee
  300.     dc.w    $eeee,$eeee,$eeee,$eeee
  301.  
  302. sin_ytab:
  303.     dc.w    57,59,60,61,62,63,64,65
  304.     dc.w    66,66,67,68,69,70,71,72
  305.     dc.w    73,74,75,76,77,78,79,80
  306.     dc.w    81,82,83,84,84,85,86,87
  307.     dc.w    88,89,90,90,91,92,93,94
  308.     dc.w    94,95,96,97,97,98,99,100
  309.     dc.w    100,101,102,102,103,103,104,105
  310.     dc.w    105,106,106,107,107,108,108,109
  311.     dc.w    109,110,110,110,111,111,112,112
  312.     dc.w    112,112,113,113,113,114,114,114
  313.     dc.w    114,114,114,115,115,115,115,115
  314.     dc.w    115,115,115,115,115,115,115,115
  315.     dc.w    115,115,114,114,114,114,114,114
  316.     dc.w    113,113,113,112,112,112,112,111
  317.     dc.w    111,110,110,110,109,109,108,108
  318.     dc.w    107,107,106,106,105,105,104,103
  319.     dc.w    103,102,102,101,100,100,99,98
  320.     dc.w    97,97,96,95,94,94,93,92
  321.     dc.w    91,90,90,89,88,87,86,85
  322.     dc.w    84,84,83,82,81,80,79,78
  323.     dc.w    77,76,75,74,73,72,71,70
  324.     dc.w    69,68,67,66,66,65,64,63
  325.     dc.w    62,61,60,59,58,56,55,54
  326.     dc.w    53,52,51,50,49,49,48,47
  327.     dc.w    46,45,44,43,42,41,40,39
  328.     dc.w    38,37,36,35,34,33,32,31
  329.     dc.w    31,30,29,28,27,26,25,25
  330.     dc.w    24,23,22,21,21,20,19,18
  331.     dc.w    18,17,16,15,15,14,13,13
  332.     dc.w    12,12,11,10,10,9,9,8
  333.     dc.w    8,7,7,6,6,5,5,5
  334.     dc.w    4,4,3,3,3,3,2,2
  335.     dc.w    2,1,1,1,1,1,1,0
  336.     dc.w    0,0,0,0,0,0,0,0
  337.     dc.w    0,0,0,0,0,0,1,1
  338.     dc.w    1,1,1,1,2,2,2,3
  339.     dc.w    3,3,3,4,4,5,5,5
  340.     dc.w    6,6,7,7,8,8,9,9
  341.     dc.w    10,10,11,12,12,13,13,14
  342.     dc.w    15,15,16,17,18,18,19,20
  343.     dc.w    21,21,22,23,24,25,25,26
  344.     dc.w    27,28,29,30,31,31,32,33
  345.     dc.w    34,35,36,37,38,39,40,41
  346.     dc.w    42,43,44,45,46,47,48,49
  347.     dc.w    49,50,51,52,53,54,55,56
  348.     dc.w    57
  349.     dc.w    $eeee,$eeee,$eeee,$eeee
  350.     dc.w    $eeee,$eeee,$eeee,$eeee
  351.     dc.w    $eeee,$eeee,$eeee,$eeee
  352.     dc.w    $eeee,$eeee,$eeee,$eeee
  353.     dc.w    $eeee,$eeee,$eeee,$eeee
  354.     dc.w    $eeee,$eeee,$eeee,$eeee
  355.     dc.w    $eeee,$eeee,$eeee,$eeee
  356.     dc.w    $eeee,$eeee,$eeee,$eeee
  357.     dc.w    $eeee,$eeee,$eeee,$eeee
  358.     dc.w    $eeee,$eeee,$eeee,$eeee
  359.  
  360. pob_shape:
  361.     dc.w    %0000000110000000,0
  362.     dc.w    %0000000110000000,0
  363.     dc.w    %0000011111100000,0
  364.     dc.w    %0000011111100000,0
  365.     dc.w    %0000000110000000,0
  366.     dc.w    %0000000110000000,0
  367.  
  368. ;===========================================================================;
  369. ;                                  DATA
  370. ;===========================================================================;
  371.  
  372. ScreenTags:
  373.     dc.l    TAGS_GAMESCREEN
  374. Screen:    dc.l    0
  375.     dc.l    GSA_MemPtr1,ScreenMem
  376.     dc.l    GSA_MemPtr2,ScreenMem+Height*Width
  377.     dc.l    GSA_MemPtr3,ScreenMem+height*width*2
  378.     dc.l    GSA_Palette,.palette
  379.     dc.l    GSA_ScrWidth,320
  380.     dc.l    GSA_ScrHeight,256
  381.     dc.l    GSA_Planes,1
  382.     dc.l    GSA_Attrib,TPLBUFFER
  383.     dc.l    GSA_ScrType,PLANAR
  384.     dc.l    TAGEND
  385. .palette
  386.     dc.l    $00000000,$00f0f000
  387.  
  388. ;===========================================================================;
  389.  
  390.     SECTION    Screens,BSS_C
  391.  
  392. ScreenMem:
  393.     ds.b    (height*width*3)+(width*50)
  394.  
  395. shape_buffer:
  396.     ds.l    256
  397. pob_xbuffer:
  398.     ds.l    (width*8)
  399. pob_ybuffer:
  400.     ds.l    height
  401.  
  402. coord_stack:
  403.     ds.l    1500
  404.